class Point {
  num? x, y;

  //命名构造函数 : 在类中使用命名构造器 (类名.函数名)实现多个构造器, 可以通过额外的清晰度(不同的初始化需求使用不同的构造器来实现)
  Point.origin(){
    x = 0;
    y = 0;
  }
  Point.fromJson({x:0, y:0}){
    this.x = x;
    this.y = y;
  }
}

//常量函数构造器:如果类生成的对象不会改变, 可以通过常量构造函数使得这些参数称为编译时的常量;
class ImmutablePoint{

  //常量函数构造器中的属性 必须是 final 来修饰
  final num x;
  final num y;

  //常量函数构造器 不能有函数体{}
  const ImmutablePoint(this.x, this.y);
}


void main(List<String> args) {
  Point p1 = Point.origin();
  print(p1.x);

  Point p2 = Point.fromJson(x:6,y:6);
  print(p2.x);

  ImmutablePoint p3 = new ImmutablePoint(1, 2);
  ImmutablePoint p4 = new ImmutablePoint(1, 2);
  print(p3 == p4);

  //声明不可变对象, 需要使用 const 关键字
  ImmutablePoint p5 = const ImmutablePoint(1, 2);
  ImmutablePoint p6 = const ImmutablePoint(1, 2);
  print(p5 == p6);

  
}